package com.example.demo.common;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * 密码工具类
 * 加密加盐 / 解密
 */
public class PasswordTools {
    /**
     * @param password 明文
     * @return 加盐的密码
     */
    public static String encrypt(String password) {
        // 1. 产生盐值
        String salt = UUID.randomUUID().toString().replace("-", "");
        // 2. 使用 (盐值 + 明文密码) 得到加密的密码
        String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // 3. 将盐值和加密的密码共同返回 (合并盐值和加密密码)
        return salt + "$" + finalPassword;
    }

    /**
     * 重载(验证用)
     *
     * @param password 明文
     * @return 加盐的密码
     */
    public static String encrypt(String password, String salt) {
        // 1. 使用 (盐值 + 明文密码) 得到加密的密码
        String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // 2. 将盐值和加密的密码共同返回 (合并盐值和加密密码)
        return salt + "$" + finalPassword;
    }

    /**
     * @param password   用户输入的明文密码
     * @param dbPassword 数据库存储的密码 (salt + $ + 加盐加密密码)
     * @return true=密码正确
     */
    public static boolean decrypt(String password, String dbPassword) {
        boolean result = false;
        if (StringUtils.hasLength(password)
                && StringUtils.hasLength(dbPassword)
                && dbPassword.length() == 65
                && dbPassword.contains("$")) {
            // 参数正确
            // 1. 得到盐值
            String[] passwordArr = dbPassword.split("\\$");
            // 1.1 盐值
            String salt = passwordArr[0];
            // 2. 生成验证密码的加盐加密密码
            String checkPassword = encrypt(password, salt);
            if (dbPassword.equals(checkPassword)) {
                result = true;
            }
        }
        return result;
    }

    public static void main(String[] args) {
        System.out.println(encrypt("111"));
    }
}
